# __call__(self[, args...])
# Python可以像调用一个函数一样去调用对象，前提是该对象的类中定义了该魔法方法
# 并且该方法支持位置参数跟关键字参数

class C:

    def __call__(self):
        print("嗨，我被调用了，执行函数 __call__")


c = C()
# Python可以像调用一个函数一样去调用对象
c()
# 嗨，我被调用了，执行函数 __call__

print("================================================================================" * 3)


class D:

    def __call__(self, *args, **kwargs):
        print("嗨，我被调用了，执行函数 __call__")
        print(F"位置参数 -> {args}")
        print(F"关键字参数 -> {kwargs}")


d = D()
# Python可以像调用一个函数一样去调用对象
d()
# 嗨，我被调用了，执行函数 __call__
# 位置参数 -> ()
# 关键字参数 -> {}

print("================================================================================" * 3)

d(1, 2, 3, x=250, y=520)
# 嗨，我被调用了，执行函数 __call__
# 位置参数 -> (1, 2, 3)
# 关键字参数 -> {'x': 250, 'y': 520}


print("================================================================================" * 3)


class Power:
    def __init__(self, exp):
        """
        求一个数的 exp 次方
        :param exp:指数
        """
        self.exp = exp

    def __call__(self, base):
        """
        计算一个数base的exp次方：base^exp
        :param base: 基数
        :return: base^exp
        """
        return base ** self.exp


# square:平方,传入的指数是2
square = Power(2)
print(square(2))

# cube:立方,传入的指数是3
cube = Power(3)
print(cube(2))
